package com.hzit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * 类名：
 * 作者：WF
 * 功能：
 * 使用Nacos步骤：
 * 第一步：添加依赖： (必须)
 *  <dependency>
 *      <groupId>com.alibaba.cloud</groupId>
 *      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 *  </dependency>
 * 第二步：启动类上添加注解：@EnableDiscoveryClient
 * 第三步：配置项目名字：（必须）
 * spring:
 *   application:
 *      name: xxx
 *
 * 第四步：配置文件中添加如下配置：
 * spring:
 *   cloud:
 *     nacos:
 *       discovery:
 *         server-addr: localhost:8848
 *
 * 使用OpenFeign服务调用的步骤：
 * 第一步：引入依赖：
 *  <dependency>
 *    <groupId>org.springframework.cloud</groupId>
 *    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
 *  </dependency>
 *  <dependency>
 *    <groupId>com.alibaba.cloud</groupId>
 *    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 *  </dependency>
 * 第二步：在启动类添加注解：@EnableFeignClients
 * 第三步：定义client接口（要远程访问的接口），添加注解：@FeignClient
 * 第四步：在application.yml中添加配置：feign.sentinel.enabled=true
 * 第五步：在接口中定义要远程访问的方法，如：
 * @FeignClient(value="hzit-user")
 * public interface UserClient {
 * 	//1. 查看所有的用户列表
 *    @GetMapping("/user/list")
 *    R<List<User>> list();
 * }
 *第六步：进行熔断处理：
 * 方法一：在@FeignClient中添加属性fallback，指定处理被调用方的请求，如：
 * @FeignClient(value="hzit-user",fallback = UserClientHandler.class)
 * @Component
 * public class UserClientHandler implements UserClient{
 *        @Override
 *    public R<List<User>> list() {
 * 		return R.fail("访问用户列表失败！");
 *    }
 * }
 * 方法二：在@FeignClient中添加属性fallbackFactory，指定处理被调用方的请求，如：
 * @FeignClient(value = "hzit-user",fallbackFactory = UserClientFactory.class)
 * @Component
 * @Slf4j
 * public class UserClientFactory implements FallbackFactory<UserClient> {
 *        @Override
 *    public UserClient create(Throwable t) {
 * 		return new UserClient() {
 *            @Override
 *            public R<List<User>> list() {
 * 				log.info("访问用户列表失败，原因是：{}",t.getMessage());
 * 				return R.fail("访问用户列表失败(UserClientFactory)！");
 *            }
 *
 *            @Override
 *            public R getPort() {
 * 				log.info("访问用户端口失败，原因是：{}",t.getMessage());
 * 				return R.fail("访问用户端口失败(UserClientFactory)！");
 *            }
 *        };
 *    }
 * }
 * 第七步：微服务调用过程中，实现了负载均衡LoadBalance,默认是轮询算法。
 */
@SpringBootApplication
// @EnableDiscoveryClient
@EnableFeignClients
public class HzitManagerApplication {
	public static void main(String[] args) {
		SpringApplication.run(HzitManagerApplication.class);
	}

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}
